Prepare data

Read and format data

df_ger_socdist$date %>% summary()
        Min.      1st Qu.       Median         Mean      3rd Qu.         Max. 
"2020-02-25" "2020-03-11" "2020-03-27" "2020-03-27" "2020-04-12" "2020-04-27" 

# prevalence 
df_ger_covid_clean <- df_ger_covid %>% mutate(date = as.Date(date, "%d%b%Y"),
                                  kreis = as.character(kreis)) %>% 
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>% 
  group_by(kreis) %>% 
  mutate(time = row_number()) %>% 
  ungroup() %>% 
  dplyr::select(-runday, -kreis_name, -ewz, -shape__area, 
                -cumcase, -anzahlfall, -popdens) %>%
  dplyr::rename(pers_o = open, 
         pers_c = sci,
         pers_e = extra,
         pers_a = agree,
         pers_n = neuro)

df_ger_covid_clean %>% head()

# social distancing
df_ger_socdist_clean <- df_ger_socdist %>% 
  filter(date >= '2020-03-09' & date <= '2020-03-31') %>% 
  mutate(kreis = as.character(kreis)) %>%
  group_by(kreis) %>% 
  mutate(time = row_number()) %>% 
  ungroup() %>% 
  rename(socdist_single_tile = all_day_ratio_single_tile_users) %>%
  select(kreis, time, socdist_single_tile)

df_ger_socdist_clean %>% head()
NA
# controls 
df_ger_ctrl_clean <- df_ger_ctrl %>% select(-kreis_nme) %>%
    mutate(kreis = as.character(kreis),
           popdens = popdens %>% 
             as.character() %>%
             str_replace('\\.', '')%>%
             as.numeric())

df_ger_ctrl_clean
NA
NA

# merge
df_ger <- df_ger_covid_clean %>% 
  plyr::join(df_ger_socdist_clean, by = c('kreis', 'time')) %>% 
  inner_join(df_ger_ctrl_clean, by = 'kreis')

Explore data

Plot prevalence over time


df_ger %>% ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall prevalence over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=rate_day)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Plot social distancing (single tile) over time


df_ger %>% ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}

Control for weekend effect


weekend <- c(6, 7, 13, 14, 20, 21)

df_ger_loess <- df_ger %>% filter(!time %in% weekend) %>% 
  split(.$kreis) %>%
  map(~ loess(socdist_single_tile ~ time, data = .)) %>%
  map(predict, 1:23) %>% 
  bind_rows() %>% 
  gather(key = 'kreis', value = 'loess') %>% 
  group_by(kreis) %>% 
  mutate(time = row_number())


df_ger <- df_ger %>% merge(df_ger_loess, by=c('kreis', 'time')) %>% 
  mutate(socdist_single_tile_clean = ifelse(time %in% weekend, loess,
                                            socdist_single_tile)) %>%
  arrange(kreis, time)


df_ger %>% ggplot(aes(x=time, y=loess, group=kreis)) +
  geom_line()

NA
NA

df_ger %>% ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  theme(legend.position="none") +
  ggtitle("Overall social distancing (single tile) over time")


pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')

for (i in pers){

gg <- df_ger %>% mutate(prev_tail = cut(.[[i]], 
      breaks = c(-Inf, quantile(.[[i]], 0.2), quantile(.[[i]], 0.8), Inf),
      labels = c('lower tail', 'center', 'upper tail'))) %>% 
  filter(prev_tail != 'center') %>%
  ggplot(aes(x=time, y=socdist_single_tile_clean)) + 
  geom_point(aes(col=kreis, size=popdens)) + 
  geom_smooth(method="loess", se=T) + 
  facet_wrap(~prev_tail) + 
  theme(legend.position="none") +
  ggtitle(i)

print(gg)
}


df_ger <- df_ger %>% mutate(socdist_single_tile = socdist_single_tile_clean) %>% 
  select(-loess, -socdist_single_tile_clean)

Correlations


df_ger %>% group_by(kreis) %>% 
  summarize_if(is.numeric, mean) %>% 
  select(-kreis, -time) %>% 
  cor(use='pairwise.complete') %>% 
  round(3)
                    pers_e pers_a pers_c pers_n pers_o rate_day socdist_single_tile  women academics
pers_e               1.000  0.223  0.255 -0.375  0.277    0.168               0.138 -0.050     0.196
pers_a               0.223  1.000  0.347 -0.379  0.167    0.135              -0.015  0.037     0.233
pers_c               0.255  0.347  1.000 -0.373 -0.063   -0.010               0.020 -0.002     0.027
pers_n              -0.375 -0.379 -0.373  1.000 -0.046   -0.127              -0.142  0.053    -0.147
pers_o               0.277  0.167 -0.063 -0.046  1.000    0.115               0.104  0.195     0.501
rate_day             0.168  0.135 -0.010 -0.127  0.115    1.000               0.228 -0.098     0.106
socdist_single_tile  0.138 -0.015  0.020 -0.142  0.104    0.228               1.000 -0.006     0.026
women               -0.050  0.037 -0.002  0.053  0.195   -0.098              -0.006  1.000     0.335
academics            0.196  0.233  0.027 -0.147  0.501    0.106               0.026  0.335     1.000
cdu                  0.090  0.024 -0.017 -0.032 -0.151    0.316               0.232 -0.404    -0.407
afd                 -0.152  0.008  0.132  0.113 -0.213   -0.212              -0.464 -0.107    -0.177
hospital_beds       -0.037  0.004 -0.157  0.111  0.281   -0.060              -0.228  0.456     0.383
tourism_beds        -0.131 -0.104 -0.053  0.034 -0.099   -0.064               0.005  0.003    -0.167
gdp                  0.141  0.044 -0.052 -0.117  0.343    0.127               0.007  0.060     0.534
manufact            -0.042 -0.040 -0.042  0.003 -0.073    0.136              -0.136 -0.313    -0.145
airport             -0.188 -0.167 -0.112  0.171 -0.222   -0.031              -0.169 -0.208    -0.416
age                 -0.289 -0.080  0.125  0.178 -0.368   -0.299              -0.267  0.149    -0.492
popdens              0.127 -0.025 -0.084 -0.007  0.415   -0.018               0.065  0.350     0.620
                       cdu    afd hospital_beds tourism_beds    gdp manufact airport    age popdens
pers_e               0.090 -0.152        -0.037       -0.131  0.141   -0.042  -0.188 -0.289   0.127
pers_a               0.024  0.008         0.004       -0.104  0.044   -0.040  -0.167 -0.080  -0.025
pers_c              -0.017  0.132        -0.157       -0.053 -0.052   -0.042  -0.112  0.125  -0.084
pers_n              -0.032  0.113         0.111        0.034 -0.117    0.003   0.171  0.178  -0.007
pers_o              -0.151 -0.213         0.281       -0.099  0.343   -0.073  -0.222 -0.368   0.415
rate_day             0.316 -0.212        -0.060       -0.064  0.127    0.136  -0.031 -0.299  -0.018
socdist_single_tile  0.232 -0.464        -0.228        0.005  0.007   -0.136  -0.169 -0.267   0.065
women               -0.404 -0.107         0.456        0.003  0.060   -0.313  -0.208  0.149   0.350
academics           -0.407 -0.177         0.383       -0.167  0.534   -0.145  -0.416 -0.492   0.620
cdu                  1.000 -0.341        -0.309        0.210 -0.093    0.229   0.277 -0.167  -0.473
afd                 -0.341  1.000         0.011       -0.044 -0.223    0.120   0.190  0.583  -0.211
hospital_beds       -0.309  0.011         1.000       -0.039  0.400    0.022  -0.046 -0.107   0.390
tourism_beds         0.210 -0.044        -0.039        1.000 -0.113   -0.102   0.357  0.198  -0.225
gdp                 -0.093 -0.223         0.400       -0.113  1.000    0.546  -0.165 -0.483   0.474
manufact             0.229  0.120         0.022       -0.102  0.546    1.000   0.169 -0.063  -0.137
airport              0.277  0.190        -0.046        0.357 -0.165    0.169   1.000  0.316  -0.438
age                 -0.167  0.583        -0.107        0.198 -0.483   -0.063   0.316  1.000  -0.461
popdens             -0.473 -0.211         0.390       -0.225  0.474   -0.137  -0.438 -0.461   1.000
 

Modelling

Prepare functions


# function calculates all relevant models
run_models <- function(y, lvl1_x, lvl2_x, lvl2_id, data, ctrls=F){

  # subset data
  data = data %>% 
    dplyr::select(all_of(y), all_of(lvl1_x), all_of(lvl2_x), all_of(lvl2_id), 
                  popdens, rate_day)
  data = data %>% 
    dplyr::rename(y = all_of(y),
           lvl1_x = all_of(lvl1_x),
           lvl2_x = all_of(lvl2_x),
           lvl2_id = all_of(lvl2_id)
           )
  
  # configure optimization procedure
  ctrl_config <- lmeControl(opt = 'optim', maxIter = 100, msMaxIter = 100)

  # baseline
  baseline <- lme(fixed = y ~ 1, random = ~ 1 | lvl2_id, 
                    data = data,
                    correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept fixed slope
  random_intercept <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                          random = ~ 1 | lvl2_id,
                            data = data,
                            correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # random intercept random slope
  random_slope <- lme(fixed = y ~ lvl1_x + lvl2_x, 
                      random = ~ lvl1_x | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction <- lme(fixed = y ~ lvl1_x * lvl2_x, 
                     random = ~ lvl1_x | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction)
  
  
  if (ctrls == 'dem' | ctrls == 'prev'){
    
    # random intercept random slope
    random_slope_ctrl_dem <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens,
                              random = ~ lvl1_x | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_main_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
    # cross level interaction
    interaction_ctrl_int_dem <- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')        
    
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem)
  }
  
  if (ctrls == 'prev'){
  
    # random intercept random slope
    random_slope_ctrl_prev <- lme(fixed = y ~ lvl1_x + lvl2_x + popdens + rate_day,
                              random = ~ lvl1_x + rate_day | lvl2_id, 
                          data = data,
                          correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')  
    
        # cross level interaction
    interaction_ctrl_main_prev <- lme(fixed = y ~ lvl1_x * lvl2_x + popdens + rate_day,
                             random = ~ lvl1_x | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                    control = ctrl_config,
                  method = 'ML')
  
  
    # cross level interaction
    interaction_ctrl_int_prev<- lme(fixed = y ~ lvl1_x * lvl2_x + lvl1_x * popdens + rate_day,
                             random = ~ lvl1_x + rate_day | lvl2_id, 
                         data = data,
                         correlation = corAR1(),
                          control = ctrl_config,
                  method = 'ML')
  
    # create list with results
    results <- list('baseline' = baseline, 
                    "random_intercept" = random_intercept, 
                    "random_slope" = random_slope,
                    "interaction" = interaction,
                    "random_slope_ctrl_dem" = random_slope_ctrl_dem,
                    "interaction_ctrl_main_dem" = interaction_ctrl_main_dem,
                    "interaction_ctrl_int_dem" = interaction_ctrl_int_dem,                    
                    "random_slope_ctrl_prev" = random_slope_ctrl_prev,
                    "interaction_ctrl_main_prev" = interaction_ctrl_main_prev,
                    "interaction_ctrl_int_prev" = interaction_ctrl_int_prev)
  }
  
  if(ctrls == 'exp'){
    # random intercept random slope
  random_slope_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) + lvl2_x, 
                      random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                        data = data,
                        correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')

  # cross level interaction
  interaction_exp <- lme(fixed = y ~ (lvl1_x + I(lvl1_x^2)) * lvl2_x, 
                     random = ~ (lvl1_x + I(lvl1_x^2)) | lvl2_id, 
                       data = data,
                       correlation = corAR1(),
                  control = ctrl_config,
                  method = 'ML')  
  
  
  # create list with results
  results <- list('baseline' = baseline, 
                  "random_intercept" = random_intercept, 
                  "random_slope" = random_slope,
                  "interaction" = interaction,                  
                  "random_slope_exp" = random_slope_exp,
                  "interaction_exp" = interaction_exp)
  }
  
  return(results)
        
}

# extracts table with coefficients and tests statistics
extract_results <- function(models) {
  
  models_summary <- models %>% 
  map(summary) %>% 
  map("tTable") %>% 
  map(as.data.frame) %>% 
  map(round, 10) 
  # %>% map(~ .[str_detect(rownames(.), 'Inter|lvl'),])
  
  return(models_summary)
  
}


compare_models <- function(models) {

  mdl_names <- models %>% names()
  
  str = ''
  for (i in mdl_names){
    
    mdl_str <- paste('models$', i, sep = '')
    
    if(i == 'baseline'){
      str <- mdl_str
    }else{
    str <- paste(str, mdl_str, sep=', ')
    }
  }
  
  anova_str <- paste0('anova(', str, ')')
  mdl_comp <- eval(parse(text=anova_str))
  rownames(mdl_comp) = mdl_names
  return(mdl_comp)
}

Rescale Data


lvl2_scaled <- df_ger %>% 
  dplyr::select(-time, -rate_day, -socdist_single_tile, -date) %>% 
  distinct() %>% 
  mutate_at(vars(-kreis), scale)
  
lvl1_scaled <- df_ger %>% select(kreis, time, rate_day, socdist_single_tile) %>% 
  mutate_at(vars(-kreis, -time), scale)

df_ger_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'kreis')

head(df_ger_scaled)
NA
NA

Predict prevalence

prevalence ~ openness


models_o_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_o_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_o_covid)
NA

prevalence ~ conscientiousness


models_c_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_c_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_c_covid)
NA
NA

prevalence ~ extraversion


models_e_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_e_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_e_covid)
NA
NA

prevalence ~ agreeableness


models_a_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_a_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_a_covid)
NA
NA

prevalence ~ neuroticism


models_n_covid <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'dem')

extract_results(models_n_covid)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem
compare_models(models_n_covid)
NA
NA

Predict social distancing

social distancing ~ openness


models_o_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_o', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'prev')

extract_results(models_o_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_o_socdist)
NA

social distancing ~ conscientiousness


models_c_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'prev')

extract_results(models_c_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_c_socdist)
NA
NA
NA

social distancing ~ extraversion


models_e_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'prev')

extract_results(models_e_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_e_socdist)
NA
NA
NA

social distancing ~ agreeableness


models_a_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'prev')

extract_results(models_a_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_a_socdist)
NA
NA
NA

social distancing ~ neuroticism


models_n_socdist <-run_models(y = 'socdist_single_tile', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'prev')

extract_results(models_n_socdist)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_ctrl_dem

$interaction_ctrl_main_dem

$interaction_ctrl_int_dem

$random_slope_ctrl_prev

$interaction_ctrl_main_prev

$interaction_ctrl_int_prev
compare_models(models_n_socdist)
NA
NA

prevalence ~ conscientiousness


models_c_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_c', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_c_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_c_covid_exp)
NA

prevalence ~ extraversion


models_e_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_e', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_e_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_e_covid_exp)
NA

prevalence ~ agreeableness


models_a_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_a', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_a_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_a_covid_exp)
NA

prevalence ~ neuroticism


models_n_covid_exp <-run_models(y = 'rate_day', 
                         lvl1_x = 'time', 
                         lvl2_x = 'pers_n', 
                         lvl2_id = 'kreis', 
                         data = df_ger_scaled,
                         ctrls = 'exp')

extract_results(models_n_covid_exp)
$baseline

$random_intercept

$random_slope

$interaction

$random_slope_exp

$interaction_exp
compare_models(models_n_covid_exp)
NA

Create overview table

Define function to create overview tables


summary_table <- function(models, dv_name, prev=F){

  temp_df_ctrl_main <- NULL
  temp_df_ctrl_int <- NULL
  temp_df_ctrl_int_prev <- NULL
  
  for (i in models){
    results <- i %>% extract_results()
    
    results_ctrl_main <- results$interaction_ctrl_main_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_main <- temp_df_ctrl_main %>% rbind(results_ctrl_main)
    
    results_ctrl_int <- results$interaction_ctrl_int_dem['lvl1_x:lvl2_x',]
    temp_df_ctrl_int <- temp_df_ctrl_int %>% rbind(results_ctrl_int)
    
    if(prev){
      results_ctrl_int_prev <- results$interaction_ctrl_int_prev['lvl1_x:lvl2_x',]
      temp_df_ctrl_int_prev <- temp_df_ctrl_int_prev %>% rbind(results_ctrl_int_prev)
    }
        
  }
  
  names_ctrl_main <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens')
  rownames(temp_df_ctrl_main) <- names_ctrl_main

  names_ctrl_int <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens*time')
  rownames(temp_df_ctrl_int) <- names_ctrl_int

  if(prev){
    names_ctrl_int_prev <- paste0(dv_name, '~', c('o', 'c', 'e', 'a', 'n'), '*time', '_crtl_popdens*time_prev')
    rownames(temp_df_ctrl_int_prev) <- names_ctrl_int_prev
    
    sum_tab <- rbind(temp_df_ctrl_main, temp_df_ctrl_int, temp_df_ctrl_int_prev) %>% round(4)
  }else{
    sum_tab <- rbind(temp_df_ctrl_main, temp_df_ctrl_int) %>% round(4)
  }


  
  return(sum_tab)

} 

Create overview tables

# prevalence
models_prev <- list(models_o_covid, 
                    models_c_covid, 
                    models_e_covid, 
                    models_a_covid, 
                    models_n_covid)

sum_tab_prev <- summary_table(models_prev, dv_name = 'prev')

write.table(sum_tab_prev, quote=F)
Value Std.Error DF t-value p-value
prev~o*time_crtl_popdens 0.0072 0.0029 8798 2.4355 0.0149
prev~c*time_crtl_popdens 3e-04 0.003 8798 0.0945 0.9247
prev~e*time_crtl_popdens 0.0099 0.0029 8798 3.4019 7e-04
prev~a*time_crtl_popdens 0.0092 0.0029 8798 3.1338 0.0017
prev~n*time_crtl_popdens -0.0072 0.0029 8798 -2.4642 0.0137
prev~o*time_crtl_popdens*time 0.0099 0.0032 8797 3.0928 0.002
prev~c*time_crtl_popdens*time 1e-04 0.003 8797 0.0219 0.9825
prev~e*time_crtl_popdens*time 0.0104 0.0029 8797 3.5486 4e-04
prev~a*time_crtl_popdens*time 0.0091 0.0029 8797 3.1155 0.0018
prev~n*time_crtl_popdens*time -0.0073 0.0029 8797 -2.4725 0.0134
# social distancing
models_socdist <- list(models_o_socdist, 
                       models_c_socdist, 
                       models_e_socdist, 
                       models_a_socdist, 
                       models_n_socdist)

sum_tab_socdist <- summary_table(models_socdist, dv_name = 'socdist', prev=T)

write.table(sum_tab_socdist, quote=F)
Value Std.Error DF t-value p-value
socdist~o*time_crtl_popdens 0.0059 0.0016 8798 3.7756 2e-04
socdist~c*time_crtl_popdens -2e-04 0.0016 8798 -0.097 0.9227
socdist~e*time_crtl_popdens 0.0038 0.0016 8798 2.4132 0.0158
socdist~a*time_crtl_popdens 0.0022 0.0016 8798 1.4111 0.1582
socdist~n*time_crtl_popdens -0.0021 0.0016 8798 -1.3383 0.1808
socdist~o*time_crtl_popdens*time 0.0044 0.0017 8797 2.5576 0.0106
socdist~c*time_crtl_popdens*time 3e-04 0.0016 8797 0.1967 0.8441
socdist~e*time_crtl_popdens*time 0.0031 0.0016 8797 1.9928 0.0463
socdist~a*time_crtl_popdens*time 0.0023 0.0016 8797 1.5053 0.1323
socdist~n*time_crtl_popdens*time -0.0021 0.0016 8797 -1.3209 0.1866
socdist~o*time_crtl_popdens*time_prev 0.0033 0.0017 8796 1.9363 0.0529
socdist~c*time_crtl_popdens*time_prev 3e-04 0.0015 8796 0.1949 0.8455
socdist~e*time_crtl_popdens*time_prev 0.002 0.0016 8796 1.2797 0.2007
socdist~a*time_crtl_popdens*time_prev 0.0013 0.0015 8796 0.8453 0.398
socdist~n*time_crtl_popdens*time_prev -0.0012 0.0015 8796 -0.8056 0.4205

Conditional random forest analysis

Extract slopes prevalence


# slope prevalence
df_ger_slope_prev <- df_ger %>% split(.$kreis) %>% 
  map(~ lm(rate_day ~ time, data = .)) %>%
  map(coef) %>% 
  map_dbl('time') %>% 
  as.data.frame() %>% 
  rownames_to_column('kreis') %>% 
  rename(slope_prev = '.')

# merge with control variables 
df_ger_slope_prev <- df_ger %>% select(-time, -date, -rate_day, -socdist_single_tile) %>%
  distinct() %>% 
  inner_join(df_ger_slope_prev, by = 'kreis') %>%
  drop_na()

df_ger_slope_prev
NA

Extract slopes social distancing


# slope socdist
df_ger_slope_socdist <- df_ger %>% split(.$kreis) %>%
  map(~ lm(socdist_single_tile ~ time, data = .)) %>%
  map(coef) %>%
  map_dbl('time') %>%
  as.data.frame() %>%
  rownames_to_column('kreis') %>%
  rename(slope_socdist = '.')


# merge with control variables 
df_ger_slope_socdist <- df_ger %>% 
  select(-time, -date, -socdist_single_tile, -rate_day) %>%
  distinct() %>%
  inner_join(df_ger_slope_socdist, by = 'kreis') %>%
  drop_na()

df_ger_slope_socdist
NA

Explore distribution of slopes


df_ger_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)


df_ger_slope_socdist %>% ggplot(aes(slope_socdist)) + geom_histogram(bins = 100)

NA
NA

CRF prevalence ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_prev <- cforest(slope_prev ~ pers_o + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_o_varimp_prev <- varimp(crf_o_fit_prev, nperm = 1)
crf_o_varimp_cond_prev <- varimp(crf_o_fit_prev, conditional = T, nperm = 1)

crf_o_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_o_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') +
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_prev <- cforest(slope_prev ~ pers_c + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_c_varimp_prev <- varimp(crf_c_fit_prev, nperm = 1)
crf_c_varimp_cond_prev <- varimp(crf_c_fit_prev, conditional = T, nperm = 1)

crf_c_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_c_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_prev <- cforest(slope_prev ~ pers_e + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_e_varimp_prev <- varimp(crf_e_fit_prev, nperm = 1)
crf_e_varimp_cond_prev <- varimp(crf_e_fit_prev, conditional = T, nperm = 1)

crf_e_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_e_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_prev <- cforest(slope_prev ~ pers_a + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_a_varimp_prev <- varimp(crf_a_fit_prev, nperm = 1)
crf_a_varimp_cond_prev <- varimp(crf_a_fit_prev, conditional = T, nperm = 1)

crf_a_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_a_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF prevalence ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_prev <- cforest(slope_prev ~ pers_n + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_prev[-1], 
                         controls = ctrls)

crf_n_varimp_prev <- varimp(crf_n_fit_prev, nperm = 1)
crf_n_varimp_cond_prev <- varimp(crf_n_fit_prev, conditional = T, nperm = 1)

crf_n_varimp_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_n_varimp_cond_prev %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ openness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_o_fit_socdist <- cforest(slope_socdist ~ pers_o + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_o_varimp_socdist <- varimp(crf_o_fit_socdist, nperm = 1)
crf_o_varimp_cond_socdist <- varimp(crf_o_fit_socdist, conditional = T, nperm = 1)

crf_o_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_o_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ conscientiousness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_c_fit_socdist <- cforest(slope_socdist ~ pers_c + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_c_varimp_socdist <- varimp(crf_c_fit_socdist, nperm = 1)
crf_c_varimp_cond_socdist <- varimp(crf_c_fit_socdist, conditional = T, nperm = 1)

crf_c_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_c_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ extraversion


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_e_fit_socdist <- cforest(slope_socdist ~ pers_e + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_e_varimp_socdist <- varimp(crf_e_fit_socdist, nperm = 1)
crf_e_varimp_cond_socdist <- varimp(crf_e_fit_socdist, conditional = T, nperm = 1)

crf_e_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_e_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ agreeableness


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_a_fit_socdist <- cforest(slope_socdist ~ pers_a + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_a_varimp_socdist <- varimp(crf_a_fit_socdist, nperm = 1)
crf_a_varimp_cond_socdist <- varimp(crf_a_fit_socdist, conditional = T, nperm = 1)

crf_a_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_a_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

CRF social distancing ~ neuroticism


ctrls <- cforest_unbiased(ntree=500, mtry=5)

crf_n_fit_socdist <- cforest(slope_socdist ~ pers_n + women + academics +
                          hospital_beds + gdp + manufact +
                          airport + age + popdens, 
                         df_ger_slope_socdist[-1], 
                         controls = ctrls)

crf_n_varimp_socdist <- varimp(crf_n_fit_socdist, nperm = 1)
crf_n_varimp_cond_socdist <- varimp(crf_n_fit_socdist, conditional = T, nperm = 1)

crf_n_varimp_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))


crf_n_varimp_cond_socdist %>% as.data.frame() %>% rownames_to_column('variable') %>%
  ggplot(aes(x=variable, y=.)) +
  geom_bar(stat = 'identity') + 
  theme(axis.text.x = element_text(angle = 90))

LS0tCnRpdGxlOiAiQ09WSUQxOSBHRVIiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMjMvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCgojIE1BQwoga25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1VzZXJzL2hwMjUwMC9Hb29nbGUgRHJpdmUvU1RVRFkvQ29sdW1iaWEvUmVzZWFyY2gvQ29yb25hL0RhdGEvR0VSJykKIApsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCgpgYGAKCiMgUHJlcGFyZSBkYXRhCgojIyMgUmVhZCBhbmQgZm9ybWF0IGRhdGEKYGBge3IgbWVzc2FnZT1GQUxTRX0KCmRmX2dlcl9jb3ZpZCA8LSByZWFkX2NzdignR2VybWFueV90aW1lc2VyaWVzX3ByZXAuY3N2JykKZGZfZ2VyX3NvY2Rpc3QgPC0gcmVhZF9jc3YoJ0dlcm1hbnlfc29jZGlzdF9mYl9rcmVpcy5jc3YnKQpkZl9nZXJfY3RybCA8LSByZWFkLmNzdjIoJ0dlcm1hbnlfY29udHJvbHMuY3N2Jywgc2VwID0gJzsnLCBkZWM9JywnKQpkZl9nZXJfY292aWQkcnVuZGF5ICU+JSBzdW1tYXJ5KCkKZGZfZ2VyX3NvY2Rpc3QkZGF0ZSAlPiUgc3VtbWFyeSgpCgpgYGAKCgpgYGB7cn0KCiMgcHJldmFsZW5jZSAKZGZfZ2VyX2NvdmlkX2NsZWFuIDwtIGRmX2dlcl9jb3ZpZCAlPiUgbXV0YXRlKGRhdGUgPSBhcy5EYXRlKGRhdGUsICIlZCViJVkiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSkgJT4lIAogIGZpbHRlcihkYXRlID49ICcyMDIwLTAzLTA5JyAmIGRhdGUgPD0gJzIwMjAtMDMtMzEnKSAlPiUgCiAgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBtdXRhdGUodGltZSA9IHJvd19udW1iZXIoKSkgJT4lIAogIHVuZ3JvdXAoKSAlPiUgCiAgZHBseXI6OnNlbGVjdCgtcnVuZGF5LCAta3JlaXNfbmFtZSwgLWV3eiwgLXNoYXBlX19hcmVhLCAKICAgICAgICAgICAgICAgIC1jdW1jYXNlLCAtYW56YWhsZmFsbCwgLXBvcGRlbnMpICU+JQogIGRwbHlyOjpyZW5hbWUocGVyc19vID0gb3BlbiwgCiAgICAgICAgIHBlcnNfYyA9IHNjaSwKICAgICAgICAgcGVyc19lID0gZXh0cmEsCiAgICAgICAgIHBlcnNfYSA9IGFncmVlLAogICAgICAgICBwZXJzX24gPSBuZXVybykKCmRmX2dlcl9jb3ZpZF9jbGVhbiAlPiUgaGVhZCgpCmBgYAoKCmBgYHtyfQoKIyBzb2NpYWwgZGlzdGFuY2luZwpkZl9nZXJfc29jZGlzdF9jbGVhbiA8LSBkZl9nZXJfc29jZGlzdCAlPiUgCiAgZmlsdGVyKGRhdGUgPj0gJzIwMjAtMDMtMDknICYgZGF0ZSA8PSAnMjAyMC0wMy0zMScpICU+JSAKICBtdXRhdGUoa3JlaXMgPSBhcy5jaGFyYWN0ZXIoa3JlaXMpKSAlPiUKICBncm91cF9ieShrcmVpcykgJT4lIAogIG11dGF0ZSh0aW1lID0gcm93X251bWJlcigpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICByZW5hbWUoc29jZGlzdF9zaW5nbGVfdGlsZSA9IGFsbF9kYXlfcmF0aW9fc2luZ2xlX3RpbGVfdXNlcnMpICU+JQogIHNlbGVjdChrcmVpcywgdGltZSwgc29jZGlzdF9zaW5nbGVfdGlsZSkKCmRmX2dlcl9zb2NkaXN0X2NsZWFuICU+JSBoZWFkKCkKCmBgYAoKCmBgYHtyfQojIGNvbnRyb2xzIApkZl9nZXJfY3RybF9jbGVhbiA8LSBkZl9nZXJfY3RybCAlPiUgc2VsZWN0KC1rcmVpc19ubWUpICU+JQogICAgbXV0YXRlKGtyZWlzID0gYXMuY2hhcmFjdGVyKGtyZWlzKSwKICAgICAgICAgICBwb3BkZW5zID0gcG9wZGVucyAlPiUgCiAgICAgICAgICAgICBhcy5jaGFyYWN0ZXIoKSAlPiUKICAgICAgICAgICAgIHN0cl9yZXBsYWNlKCdcXC4nLCAnJyklPiUKICAgICAgICAgICAgIGFzLm51bWVyaWMoKSkKCmRmX2dlcl9jdHJsX2NsZWFuCgoKYGBgCgoKYGBge3J9CgojIG1lcmdlCmRmX2dlciA8LSBkZl9nZXJfY292aWRfY2xlYW4gJT4lIAogIHBseXI6OmpvaW4oZGZfZ2VyX3NvY2Rpc3RfY2xlYW4sIGJ5ID0gYygna3JlaXMnLCAndGltZScpKSAlPiUgCiAgaW5uZXJfam9pbihkZl9nZXJfY3RybF9jbGVhbiwgYnkgPSAna3JlaXMnKQoKYGBgCgoKIyBFeHBsb3JlIGRhdGEKCiMjIyBQbG90IHByZXZhbGVuY2Ugb3ZlciB0aW1lCmBgYHtyfQoKZGZfZ2VyICU+JSBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWtyZWlzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHByZXZhbGVuY2Ugb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl9nZXIgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXJhdGVfZGF5KSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+cHJldl90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgoKIyMjIFBsb3Qgc29jaWFsIGRpc3RhbmNpbmcgKHNpbmdsZSB0aWxlKSBvdmVyIHRpbWUKYGBge3J9CgpkZl9nZXIgJT4lIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBzb2NpYWwgZGlzdGFuY2luZyAoc2luZ2xlIHRpbGUpIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfZ2VyICU+JSBtdXRhdGUocHJldl90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgIGJyZWFrcyA9IGMoLUluZiwgcXVhbnRpbGUoLltbaV1dLCAwLjIpLCBxdWFudGlsZSguW1tpXV0sIDAuOCksIEluZiksCiAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9a3JlaXMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+cHJldl90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgojIyMgQ29udHJvbCBmb3Igd2Vla2VuZCBlZmZlY3QgCmBgYHtyfQoKd2Vla2VuZCA8LSBjKDYsIDcsIDEzLCAxNCwgMjAsIDIxKQoKZGZfZ2VyX2xvZXNzIDwtIGRmX2dlciAlPiUgZmlsdGVyKCF0aW1lICVpbiUgd2Vla2VuZCkgJT4lIAogIHNwbGl0KC4ka3JlaXMpICU+JQogIG1hcCh+IGxvZXNzKHNvY2Rpc3Rfc2luZ2xlX3RpbGUgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChwcmVkaWN0LCAxOjIzKSAlPiUgCiAgYmluZF9yb3dzKCkgJT4lIAogIGdhdGhlcihrZXkgPSAna3JlaXMnLCB2YWx1ZSA9ICdsb2VzcycpICU+JSAKICBncm91cF9ieShrcmVpcykgJT4lIAogIG11dGF0ZSh0aW1lID0gcm93X251bWJlcigpKQoKCmRmX2dlciA8LSBkZl9nZXIgJT4lIG1lcmdlKGRmX2dlcl9sb2VzcywgYnk9Yygna3JlaXMnLCAndGltZScpKSAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4gPSBpZmVsc2UodGltZSAlaW4lIHdlZWtlbmQsIGxvZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSAlPiUKICBhcnJhbmdlKGtyZWlzLCB0aW1lKQoKCmRmX2dlciAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9bG9lc3MsIGdyb3VwPWtyZWlzKSkgKwogIGdlb21fbGluZSgpCgoKYGBgCgpgYGB7cn0KCmRmX2dlciAlPiUgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWtyZWlzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHNvY2lhbCBkaXN0YW5jaW5nIChzaW5nbGUgdGlsZSkgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl9nZXIgJT4lIG11dGF0ZShwcmV2X3RhaWwgPSBjdXQoLltbaV1dLCAKICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMiksIHF1YW50aWxlKC5bW2ldXSwgMC44KSwgSW5mKSwKICAgICAgbGFiZWxzID0gYygnbG93ZXIgdGFpbCcsICdjZW50ZXInLCAndXBwZXIgdGFpbCcpKSkgJT4lIAogIGZpbHRlcihwcmV2X3RhaWwgIT0gJ2NlbnRlcicpICU+JQogIGdncGxvdChhZXMoeD10aW1lLCB5PXNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4pKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1rcmVpcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICBmYWNldF93cmFwKH5wcmV2X3RhaWwpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCgpgYGB7cn0KCmRmX2dlciA8LSBkZl9nZXIgJT4lIG11dGF0ZShzb2NkaXN0X3NpbmdsZV90aWxlID0gc29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikgJT4lIAogIHNlbGVjdCgtbG9lc3MsIC1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKQoKYGBgCgoKIyMjIENvcnJlbGF0aW9ucwpgYGB7cn0KCmRmX2dlciAlPiUgZ3JvdXBfYnkoa3JlaXMpICU+JSAKICBzdW1tYXJpemVfaWYoaXMubnVtZXJpYywgbWVhbikgJT4lIAogIHNlbGVjdCgta3JlaXMsIC10aW1lKSAlPiUgCiAgY29yKHVzZT0ncGFpcndpc2UuY29tcGxldGUnKSAlPiUgCiAgcm91bmQoMykKIApgYGAKCiMgTW9kZWxsaW5nIAojIyBQcmVwYXJlIGZ1bmN0aW9ucwoKYGBge3J9CgojIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgYWxsIHJlbGV2YW50IG1vZGVscwpydW5fbW9kZWxzIDwtIGZ1bmN0aW9uKHksIGx2bDFfeCwgbHZsMl94LCBsdmwyX2lkLCBkYXRhLCBjdHJscz1GKXsKCiAgIyBzdWJzZXQgZGF0YQogIGRhdGEgPSBkYXRhICU+JSAKICAgIGRwbHlyOjpzZWxlY3QoYWxsX29mKHkpLCBhbGxfb2YobHZsMV94KSwgYWxsX29mKGx2bDJfeCksIGFsbF9vZihsdmwyX2lkKSwgCiAgICAgICAgICAgICAgICAgIHBvcGRlbnMsIHJhdGVfZGF5KQogIGRhdGEgPSBkYXRhICU+JSAKICAgIGRwbHlyOjpyZW5hbWUoeSA9IGFsbF9vZih5KSwKICAgICAgICAgICBsdmwxX3ggPSBhbGxfb2YobHZsMV94KSwKICAgICAgICAgICBsdmwyX3ggPSBhbGxfb2YobHZsMl94KSwKICAgICAgICAgICBsdmwyX2lkID0gYWxsX29mKGx2bDJfaWQpCiAgICAgICAgICAgKQogIAogICMgY29uZmlndXJlIG9wdGltaXphdGlvbiBwcm9jZWR1cmUKICBjdHJsX2NvbmZpZyA8LSBsbWVDb250cm9sKG9wdCA9ICdvcHRpbScsIG1heEl0ZXIgPSAxMDAsIG1zTWF4SXRlciA9IDEwMCkKCiAgIyBiYXNlbGluZQogIGJhc2VsaW5lIDwtIGxtZShmaXhlZCA9IHkgfiAxLCByYW5kb20gPSB+IDEgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCgogICMgcmFuZG9tIGludGVyY2VwdCBmaXhlZCBzbG9wZQogIHJhbmRvbV9pbnRlcmNlcHQgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiAxIHwgbHZsMl9pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQoKICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgcmFuZG9tX3Nsb3BlIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gfiBsdmwxX3ggfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogIGludGVyYWN0aW9uIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3gsIAogICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogIHJlc3VsdHMgPC0gbGlzdCgnYmFzZWxpbmUnID0gYmFzZWxpbmUsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbiIgPSBpbnRlcmFjdGlvbikKICAKICAKICBpZiAoY3RybHMgPT0gJ2RlbScgfCBjdHJscyA9PSAncHJldicpewogICAgCiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgICByYW5kb21fc2xvcGVfY3RybF9kZW0gPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCArIGx2bDJfeCArIHBvcGRlbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyb3NzIGxldmVsIGludGVyYWN0aW9uCiAgICBpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKQogIAogICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKiBsdmwyX3ggKyBsdmwxX3ggKiBwb3BkZW5zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94IHwgbHZsMl9pZCwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGN0cmxfY29uZmlnLAogICAgICAgICAgICAgICAgICBtZXRob2QgPSAnTUwnKSAgICAgICAgCiAgICAKICAgICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgICByZXN1bHRzIDwtIGxpc3QoJ2Jhc2VsaW5lJyA9IGJhc2VsaW5lLCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX2ludGVyY2VwdCIgPSByYW5kb21faW50ZXJjZXB0LCAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb24iID0gaW50ZXJhY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZV9jdHJsX2RlbSIgPSByYW5kb21fc2xvcGVfY3RybF9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0iID0gaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbSwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfaW50X2RlbSkKICB9CiAgCiAgaWYgKGN0cmxzID09ICdwcmV2Jyl7CiAgCiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgICByYW5kb21fc2xvcGVfY3RybF9wcmV2IDwtIGxtZShmaXhlZCA9IHkgfiBsdmwxX3ggKyBsdmwyX3ggKyBwb3BkZW5zICsgcmF0ZV9kYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94ICsgcmF0ZV9kYXkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgIAogICAgCiAgICAgICAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogICAgaW50ZXJhY3Rpb25fY3RybF9tYWluX3ByZXYgPC0gbG1lKGZpeGVkID0geSB+IGx2bDFfeCAqIGx2bDJfeCArIHBvcGRlbnMgKyByYXRlX2RheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IGx2bDFfeCB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWxhdGlvbiA9IGNvckFSMSgpLAogICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKICAKICAKICAgICMgY3Jvc3MgbGV2ZWwgaW50ZXJhY3Rpb24KICAgIGludGVyYWN0aW9uX2N0cmxfaW50X3ByZXY8LSBsbWUoZml4ZWQgPSB5IH4gbHZsMV94ICogbHZsMl94ICsgbHZsMV94ICogcG9wZGVucyArIHJhdGVfZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gbHZsMV94ICsgcmF0ZV9kYXkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgY29ycmVsYXRpb24gPSBjb3JBUjEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gY3RybF9jb25maWcsCiAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICdNTCcpCiAgCiAgICAjIGNyZWF0ZSBsaXN0IHdpdGggcmVzdWx0cwogICAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9pbnRlcmNlcHQiID0gcmFuZG9tX2ludGVyY2VwdCwgCiAgICAgICAgICAgICAgICAgICAgInJhbmRvbV9zbG9wZSIgPSByYW5kb21fc2xvcGUsCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICJyYW5kb21fc2xvcGVfY3RybF9kZW0iID0gcmFuZG9tX3Nsb3BlX2N0cmxfZGVtLAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fZGVtIiA9IGludGVyYWN0aW9uX2N0cmxfbWFpbl9kZW0sCiAgICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uX2N0cmxfaW50X2RlbSIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9kZW0sICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2N0cmxfcHJldiIgPSByYW5kb21fc2xvcGVfY3RybF9wcmV2LAogICAgICAgICAgICAgICAgICAgICJpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiIgPSBpbnRlcmFjdGlvbl9jdHJsX21haW5fcHJldiwKICAgICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fY3RybF9pbnRfcHJldiIgPSBpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2KQogIH0KICAKICBpZihjdHJscyA9PSAnZXhwJyl7CiAgICAjIHJhbmRvbSBpbnRlcmNlcHQgcmFuZG9tIHNsb3BlCiAgcmFuZG9tX3Nsb3BlX2V4cCA8LSBsbWUoZml4ZWQgPSB5IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSArIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSB+IChsdmwxX3ggKyBJKGx2bDFfeF4yKSkgfCBsdmwyX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykKCiAgIyBjcm9zcyBsZXZlbCBpbnRlcmFjdGlvbgogIGludGVyYWN0aW9uX2V4cCA8LSBsbWUoZml4ZWQgPSB5IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSAqIGx2bDJfeCwgCiAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IH4gKGx2bDFfeCArIEkobHZsMV94XjIpKSB8IGx2bDJfaWQsIAogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9uID0gY29yQVIxKCksCiAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBjdHJsX2NvbmZpZywKICAgICAgICAgICAgICAgICAgbWV0aG9kID0gJ01MJykgIAogIAogIAogICMgY3JlYXRlIGxpc3Qgd2l0aCByZXN1bHRzCiAgcmVzdWx0cyA8LSBsaXN0KCdiYXNlbGluZScgPSBiYXNlbGluZSwgCiAgICAgICAgICAgICAgICAgICJyYW5kb21faW50ZXJjZXB0IiA9IHJhbmRvbV9pbnRlcmNlcHQsIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlIiA9IHJhbmRvbV9zbG9wZSwKICAgICAgICAgICAgICAgICAgImludGVyYWN0aW9uIiA9IGludGVyYWN0aW9uLCAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAicmFuZG9tX3Nsb3BlX2V4cCIgPSByYW5kb21fc2xvcGVfZXhwLAogICAgICAgICAgICAgICAgICAiaW50ZXJhY3Rpb25fZXhwIiA9IGludGVyYWN0aW9uX2V4cCkKICB9CiAgCiAgcmV0dXJuKHJlc3VsdHMpCiAgICAgICAgCn0KCiMgZXh0cmFjdHMgdGFibGUgd2l0aCBjb2VmZmljaWVudHMgYW5kIHRlc3RzIHN0YXRpc3RpY3MKZXh0cmFjdF9yZXN1bHRzIDwtIGZ1bmN0aW9uKG1vZGVscykgewogIAogIG1vZGVsc19zdW1tYXJ5IDwtIG1vZGVscyAlPiUgCiAgbWFwKHN1bW1hcnkpICU+JSAKICBtYXAoInRUYWJsZSIpICU+JSAKICBtYXAoYXMuZGF0YS5mcmFtZSkgJT4lIAogIG1hcChyb3VuZCwgMTApIAogICMgJT4lIG1hcCh+IC5bc3RyX2RldGVjdChyb3duYW1lcyguKSwgJ0ludGVyfGx2bCcpLF0pCiAgCiAgcmV0dXJuKG1vZGVsc19zdW1tYXJ5KQogIAp9CgoKY29tcGFyZV9tb2RlbHMgPC0gZnVuY3Rpb24obW9kZWxzKSB7CgogIG1kbF9uYW1lcyA8LSBtb2RlbHMgJT4lIG5hbWVzKCkKICAKICBzdHIgPSAnJwogIGZvciAoaSBpbiBtZGxfbmFtZXMpewogICAgCiAgICBtZGxfc3RyIDwtIHBhc3RlKCdtb2RlbHMkJywgaSwgc2VwID0gJycpCiAgICAKICAgIGlmKGkgPT0gJ2Jhc2VsaW5lJyl7CiAgICAgIHN0ciA8LSBtZGxfc3RyCiAgICB9ZWxzZXsKICAgIHN0ciA8LSBwYXN0ZShzdHIsIG1kbF9zdHIsIHNlcD0nLCAnKQogICAgfQogIH0KICAKICBhbm92YV9zdHIgPC0gcGFzdGUwKCdhbm92YSgnLCBzdHIsICcpJykKICBtZGxfY29tcCA8LSBldmFsKHBhcnNlKHRleHQ9YW5vdmFfc3RyKSkKICByb3duYW1lcyhtZGxfY29tcCkgPSBtZGxfbmFtZXMKICByZXR1cm4obWRsX2NvbXApCn0KCgpgYGAKCiMjIFJlc2NhbGUgRGF0YQpgYGB7cn0KCmx2bDJfc2NhbGVkIDwtIGRmX2dlciAlPiUgCiAgZHBseXI6OnNlbGVjdCgtdGltZSwgLXJhdGVfZGF5LCAtc29jZGlzdF9zaW5nbGVfdGlsZSwgLWRhdGUpICU+JSAKICBkaXN0aW5jdCgpICU+JSAKICBtdXRhdGVfYXQodmFycygta3JlaXMpLCBzY2FsZSkKICAKbHZsMV9zY2FsZWQgPC0gZGZfZ2VyICU+JSBzZWxlY3Qoa3JlaXMsIHRpbWUsIHJhdGVfZGF5LCBzb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUgCiAgbXV0YXRlX2F0KHZhcnMoLWtyZWlzLCAtdGltZSksIHNjYWxlKQoKZGZfZ2VyX3NjYWxlZCA8LSBwbHlyOjpqb2luKGx2bDFfc2NhbGVkLCBsdmwyX3NjYWxlZCwgYnkgPSAna3JlaXMnKQoKaGVhZChkZl9nZXJfc2NhbGVkKQoKCmBgYAoKCgojIyBQcmVkaWN0IHByZXZhbGVuY2UKIyMjIHByZXZhbGVuY2UgfiBvcGVubmVzcwpgYGB7cn0KCm1vZGVsc19vX2NvdmlkIDwtcnVuX21vZGVscyh5ID0gJ3JhdGVfZGF5JywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdkZW0nKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19vX2NvdmlkKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX29fY292aWQpCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9Cgptb2RlbHNfY19jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2MnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19jX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBleHRyYXZlcnNpb24KYGBge3J9Cgptb2RlbHNfZV9jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19lX2NvdmlkKQoKCmBgYAoKIyMjIHByZXZhbGVuY2UgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKbW9kZWxzX2FfY292aWQgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2RlbScpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2FfY292aWQpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9jb3ZpZCkKCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gbmV1cm90aWNpc20KYGBge3J9Cgptb2RlbHNfbl9jb3ZpZCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX24nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZGVtJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9jb3ZpZCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19uX2NvdmlkKQoKCmBgYAoKIyMgUHJlZGljdCBzb2NpYWwgZGlzdGFuY2luZwojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBvcGVubmVzcwpgYGB7cn0KCm1vZGVsc19vX3NvY2Rpc3QgPC1ydW5fbW9kZWxzKHkgPSAnc29jZGlzdF9zaW5nbGVfdGlsZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX28nLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAncHJldicpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX29fc29jZGlzdCkKCmNvbXBhcmVfbW9kZWxzKG1vZGVsc19vX3NvY2Rpc3QpCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKbW9kZWxzX2Nfc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfYycsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfY19zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2Nfc29jZGlzdCkKCgoKYGBgCgojIyMgc29jaWFsIGRpc3RhbmNpbmcgfiBleHRyYXZlcnNpb24KYGBge3J9Cgptb2RlbHNfZV9zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3Rfc2luZ2xlX3RpbGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19lX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfZV9zb2NkaXN0KQoKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IGFncmVlYWJsZW5lc3MKYGBge3J9Cgptb2RlbHNfYV9zb2NkaXN0IDwtcnVuX21vZGVscyh5ID0gJ3NvY2Rpc3Rfc2luZ2xlX3RpbGUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19hJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ3ByZXYnKQoKZXh0cmFjdF9yZXN1bHRzKG1vZGVsc19hX3NvY2Rpc3QpCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9zb2NkaXN0KQoKCgpgYGAKCiMjIyBzb2NpYWwgZGlzdGFuY2luZyB+IG5ldXJvdGljaXNtCmBgYHtyfQoKbW9kZWxzX25fc29jZGlzdCA8LXJ1bl9tb2RlbHMoeSA9ICdzb2NkaXN0X3NpbmdsZV90aWxlJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwxX3ggPSAndGltZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbicsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl9pZCA9ICdrcmVpcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX2dlcl9zY2FsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBjdHJscyA9ICdwcmV2JykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfbl9zb2NkaXN0KQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fc29jZGlzdCkKCgpgYGAKCiMjIEV4cGxvcmUgcXVhZHJhdGljIHRyZW5kcyAKCiMjIyBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9Cgptb2RlbHNfb19jb3ZpZF9leHAgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMl94ID0gJ3BlcnNfbycsCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfb19jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfb19jb3ZpZF9leHApCgpgYGAKCgojIyBwcmV2YWxlbmNlIH4gY29uc2NpZW50aW91c25lc3MKYGBge3J9Cgptb2RlbHNfY19jb3ZpZF9leHAgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19jJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX2NfY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX2NfY292aWRfZXhwKQoKYGBgCgojIyMgcHJldmFsZW5jZSB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCm1vZGVsc19lX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2UnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfZV9jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfZV9jb3ZpZF9leHApCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gYWdyZWVhYmxlbmVzcwpgYGB7cn0KCm1vZGVsc19hX2NvdmlkX2V4cCA8LXJ1bl9tb2RlbHMoeSA9ICdyYXRlX2RheScsIAogICAgICAgICAgICAgICAgICAgICAgICAgbHZsMV94ID0gJ3RpbWUnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfeCA9ICdwZXJzX2EnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDJfaWQgPSAna3JlaXMnLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl9nZXJfc2NhbGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgY3RybHMgPSAnZXhwJykKCmV4dHJhY3RfcmVzdWx0cyhtb2RlbHNfYV9jb3ZpZF9leHApCgpjb21wYXJlX21vZGVscyhtb2RlbHNfYV9jb3ZpZF9leHApCgpgYGAKCiMjIyBwcmV2YWxlbmNlIH4gbmV1cm90aWNpc20KYGBge3J9Cgptb2RlbHNfbl9jb3ZpZF9leHAgPC1ydW5fbW9kZWxzKHkgPSAncmF0ZV9kYXknLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGx2bDFfeCA9ICd0aW1lJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX3ggPSAncGVyc19uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBsdmwyX2lkID0gJ2tyZWlzJywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfZ2VyX3NjYWxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgIGN0cmxzID0gJ2V4cCcpCgpleHRyYWN0X3Jlc3VsdHMobW9kZWxzX25fY292aWRfZXhwKQoKY29tcGFyZV9tb2RlbHMobW9kZWxzX25fY292aWRfZXhwKQoKYGBgCgojIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGUgCgojIyMgRGVmaW5lIGZ1bmN0aW9uIHRvIGNyZWF0ZSBvdmVydmlldyB0YWJsZXMKYGBge3J9CgpzdW1tYXJ5X3RhYmxlIDwtIGZ1bmN0aW9uKG1vZGVscywgZHZfbmFtZSwgcHJldj1GKXsKCiAgdGVtcF9kZl9jdHJsX21haW4gPC0gTlVMTAogIHRlbXBfZGZfY3RybF9pbnQgPC0gTlVMTAogIHRlbXBfZGZfY3RybF9pbnRfcHJldiA8LSBOVUxMCiAgCiAgZm9yIChpIGluIG1vZGVscyl7CiAgICByZXN1bHRzIDwtIGkgJT4lIGV4dHJhY3RfcmVzdWx0cygpCiAgICAKICAgIHJlc3VsdHNfY3RybF9tYWluIDwtIHJlc3VsdHMkaW50ZXJhY3Rpb25fY3RybF9tYWluX2RlbVsnbHZsMV94Omx2bDJfeCcsXQogICAgdGVtcF9kZl9jdHJsX21haW4gPC0gdGVtcF9kZl9jdHJsX21haW4gJT4lIHJiaW5kKHJlc3VsdHNfY3RybF9tYWluKQogICAgCiAgICByZXN1bHRzX2N0cmxfaW50IDwtIHJlc3VsdHMkaW50ZXJhY3Rpb25fY3RybF9pbnRfZGVtWydsdmwxX3g6bHZsMl94JyxdCiAgICB0ZW1wX2RmX2N0cmxfaW50IDwtIHRlbXBfZGZfY3RybF9pbnQgJT4lIHJiaW5kKHJlc3VsdHNfY3RybF9pbnQpCiAgICAKICAgIGlmKHByZXYpewogICAgICByZXN1bHRzX2N0cmxfaW50X3ByZXYgPC0gcmVzdWx0cyRpbnRlcmFjdGlvbl9jdHJsX2ludF9wcmV2WydsdmwxX3g6bHZsMl94JyxdCiAgICAgIHRlbXBfZGZfY3RybF9pbnRfcHJldiA8LSB0ZW1wX2RmX2N0cmxfaW50X3ByZXYgJT4lIHJiaW5kKHJlc3VsdHNfY3RybF9pbnRfcHJldikKICAgIH0KICAgICAgICAKICB9CiAgCiAgbmFtZXNfY3RybF9tYWluIDwtIHBhc3RlMChkdl9uYW1lLCAnficsIGMoJ28nLCAnYycsICdlJywgJ2EnLCAnbicpLCAnKnRpbWUnLCAnX2NydGxfcG9wZGVucycpCiAgcm93bmFtZXModGVtcF9kZl9jdHJsX21haW4pIDwtIG5hbWVzX2N0cmxfbWFpbgoKICBuYW1lc19jdHJsX2ludCA8LSBwYXN0ZTAoZHZfbmFtZSwgJ34nLCBjKCdvJywgJ2MnLCAnZScsICdhJywgJ24nKSwgJyp0aW1lJywgJ19jcnRsX3BvcGRlbnMqdGltZScpCiAgcm93bmFtZXModGVtcF9kZl9jdHJsX2ludCkgPC0gbmFtZXNfY3RybF9pbnQKCiAgaWYocHJldil7CiAgICBuYW1lc19jdHJsX2ludF9wcmV2IDwtIHBhc3RlMChkdl9uYW1lLCAnficsIGMoJ28nLCAnYycsICdlJywgJ2EnLCAnbicpLCAnKnRpbWUnLCAnX2NydGxfcG9wZGVucyp0aW1lX3ByZXYnKQogICAgcm93bmFtZXModGVtcF9kZl9jdHJsX2ludF9wcmV2KSA8LSBuYW1lc19jdHJsX2ludF9wcmV2CiAgICAKICAgIHN1bV90YWIgPC0gcmJpbmQodGVtcF9kZl9jdHJsX21haW4sIHRlbXBfZGZfY3RybF9pbnQsIHRlbXBfZGZfY3RybF9pbnRfcHJldikgJT4lIHJvdW5kKDQpCiAgfWVsc2V7CiAgICBzdW1fdGFiIDwtIHJiaW5kKHRlbXBfZGZfY3RybF9tYWluLCB0ZW1wX2RmX2N0cmxfaW50KSAlPiUgcm91bmQoNCkKICB9CgoKICAKICByZXR1cm4oc3VtX3RhYikKCn0gCgpgYGAKCiMjIyBDcmVhdGUgb3ZlcnZpZXcgdGFibGVzCmBgYHtyfQojIHByZXZhbGVuY2UKbW9kZWxzX3ByZXYgPC0gbGlzdChtb2RlbHNfb19jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX2NfY292aWQsIAogICAgICAgICAgICAgICAgICAgIG1vZGVsc19lX2NvdmlkLCAKICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9jb3ZpZCwgCiAgICAgICAgICAgICAgICAgICAgbW9kZWxzX25fY292aWQpCgpzdW1fdGFiX3ByZXYgPC0gc3VtbWFyeV90YWJsZShtb2RlbHNfcHJldiwgZHZfbmFtZSA9ICdwcmV2JykKCndyaXRlLnRhYmxlKHN1bV90YWJfcHJldiwgcXVvdGU9RikKCiMgc29jaWFsIGRpc3RhbmNpbmcKbW9kZWxzX3NvY2Rpc3QgPC0gbGlzdChtb2RlbHNfb19zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfY19zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfZV9zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfYV9zb2NkaXN0LCAKICAgICAgICAgICAgICAgICAgICAgICBtb2RlbHNfbl9zb2NkaXN0KQoKc3VtX3RhYl9zb2NkaXN0IDwtIHN1bW1hcnlfdGFibGUobW9kZWxzX3NvY2Rpc3QsIGR2X25hbWUgPSAnc29jZGlzdCcsIHByZXY9VCkKCndyaXRlLnRhYmxlKHN1bV90YWJfc29jZGlzdCwgcXVvdGU9RikKCgoKYGBgCgojIENvbmRpdGlvbmFsIHJhbmRvbSBmb3Jlc3QgYW5hbHlzaXMgCgojIyMgRXh0cmFjdCBzbG9wZXMgcHJldmFsZW5jZQpgYGB7cn0KCiMgc2xvcGUgcHJldmFsZW5jZQpkZl9nZXJfc2xvcGVfcHJldiA8LSBkZl9nZXIgJT4lIHNwbGl0KC4ka3JlaXMpICU+JSAKICBtYXAofiBsbShyYXRlX2RheSB+IHRpbWUsIGRhdGEgPSAuKSkgJT4lCiAgbWFwKGNvZWYpICU+JSAKICBtYXBfZGJsKCd0aW1lJykgJT4lIAogIGFzLmRhdGEuZnJhbWUoKSAlPiUgCiAgcm93bmFtZXNfdG9fY29sdW1uKCdrcmVpcycpICU+JSAKICByZW5hbWUoc2xvcGVfcHJldiA9ICcuJykKCiMgbWVyZ2Ugd2l0aCBjb250cm9sIHZhcmlhYmxlcyAKZGZfZ2VyX3Nsb3BlX3ByZXYgPC0gZGZfZ2VyICU+JSBzZWxlY3QoLXRpbWUsIC1kYXRlLCAtcmF0ZV9kYXksIC1zb2NkaXN0X3NpbmdsZV90aWxlKSAlPiUKICBkaXN0aW5jdCgpICU+JSAKICBpbm5lcl9qb2luKGRmX2dlcl9zbG9wZV9wcmV2LCBieSA9ICdrcmVpcycpICU+JQogIGRyb3BfbmEoKQoKZGZfZ2VyX3Nsb3BlX3ByZXYKCmBgYAoKCiMjIyBFeHRyYWN0IHNsb3BlcyBzb2NpYWwgZGlzdGFuY2luZwpgYGB7cn0KCiMgc2xvcGUgc29jZGlzdApkZl9nZXJfc2xvcGVfc29jZGlzdCA8LSBkZl9nZXJfc2NhbGVkICU+JSBzcGxpdCguJGtyZWlzKSAlPiUKICBtYXAofiBsbShzb2NkaXN0X3NpbmdsZV90aWxlIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAoY29lZikgJT4lCiAgbWFwX2RibCgndGltZScpICU+JQogIGFzLmRhdGEuZnJhbWUoKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ2tyZWlzJykgJT4lCiAgcmVuYW1lKHNsb3BlX3NvY2Rpc3QgPSAnLicpCgoKIyBtZXJnZSB3aXRoIGNvbnRyb2wgdmFyaWFibGVzIApkZl9nZXJfc2xvcGVfc29jZGlzdCA8LSBkZl9nZXJfc2NhbGVkICU+JSAKICBzZWxlY3QoLXRpbWUsIC1kYXRlLCAtc29jZGlzdF9zaW5nbGVfdGlsZSwgLXJhdGVfZGF5KSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGlubmVyX2pvaW4oZGZfZ2VyX3Nsb3BlX3NvY2Rpc3QsIGJ5ID0gJ2tyZWlzJykgJT4lCiAgZHJvcF9uYSgpCgpkZl9nZXJfc2xvcGVfc29jZGlzdAoKYGBgCgojIyMgRXhwbG9yZSBkaXN0cmlidXRpb24gb2Ygc2xvcGVzCmBgYHtyfQoKZGZfZ2VyX3Nsb3BlX3ByZXYgJT4lIGdncGxvdChhZXMoc2xvcGVfcHJldikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKCmRmX2dlcl9zbG9wZV9zb2NkaXN0ICU+JSBnZ3Bsb3QoYWVzKHNsb3BlX3NvY2Rpc3QpKSArIGdlb21faGlzdG9ncmFtKGJpbnMgPSAxMDApCgoKYGBgCgojIENSRiBwcmV2YWxlbmNlIH4gb3Blbm5lc3MKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX29fZml0X3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19vICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3ByZXZbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfb192YXJpbXBfcHJldiA8LSB2YXJpbXAoY3JmX29fZml0X3ByZXYsIG5wZXJtID0gMSkKY3JmX29fdmFyaW1wX2NvbmRfcHJldiA8LSB2YXJpbXAoY3JmX29fZml0X3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX29fdmFyaW1wX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX29fdmFyaW1wX2NvbmRfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgcHJldmFsZW5jZSB+IGNvbnNjaWVudGlvdXNuZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9jX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfYyArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2NfdmFyaW1wX3ByZXYgPC0gdmFyaW1wKGNyZl9jX2ZpdF9wcmV2LCBucGVybSA9IDEpCmNyZl9jX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9jX2ZpdF9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9jX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9jX3ZhcmltcF9jb25kX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyBDUkYgcHJldmFsZW5jZSB+IGV4dHJhdmVyc2lvbgpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfZV9maXRfcHJldiA8LSBjZm9yZXN0KHNsb3BlX3ByZXYgfiBwZXJzX2UgKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfcHJldlstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9lX3ZhcmltcF9wcmV2IDwtIHZhcmltcChjcmZfZV9maXRfcHJldiwgbnBlcm0gPSAxKQpjcmZfZV92YXJpbXBfY29uZF9wcmV2IDwtIHZhcmltcChjcmZfZV9maXRfcHJldiwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfZV92YXJpbXBfcHJldiAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfZV92YXJpbXBfY29uZF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHByZXZhbGVuY2UgfiBhZ3JlZWFibGVuZXNzCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9hX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfYSArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX2FfdmFyaW1wX3ByZXYgPC0gdmFyaW1wKGNyZl9hX2ZpdF9wcmV2LCBucGVybSA9IDEpCmNyZl9hX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9hX2ZpdF9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9hX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9hX3ZhcmltcF9jb25kX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyBDUkYgcHJldmFsZW5jZSB+IG5ldXJvdGljaXNtCmBgYHtyfQoKY3RybHMgPC0gY2ZvcmVzdF91bmJpYXNlZChudHJlZT01MDAsIG10cnk9NSkKCmNyZl9uX2ZpdF9wcmV2IDwtIGNmb3Jlc3Qoc2xvcGVfcHJldiB+IHBlcnNfbiArIHdvbWVuICsgYWNhZGVtaWNzICsKICAgICAgICAgICAgICAgICAgICAgICAgICBob3NwaXRhbF9iZWRzICsgZ2RwICsgbWFudWZhY3QgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnQgKyBhZ2UgKyBwb3BkZW5zLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRmX2dlcl9zbG9wZV9wcmV2Wy0xXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX25fdmFyaW1wX3ByZXYgPC0gdmFyaW1wKGNyZl9uX2ZpdF9wcmV2LCBucGVybSA9IDEpCmNyZl9uX3ZhcmltcF9jb25kX3ByZXYgPC0gdmFyaW1wKGNyZl9uX2ZpdF9wcmV2LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9uX3ZhcmltcF9wcmV2ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9uX3ZhcmltcF9jb25kX3ByZXYgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBvcGVubmVzcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfb19maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX28gKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9vX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfb19maXRfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfb192YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfb19maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfb192YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfb192YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBjb25zY2llbnRpb3VzbmVzcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfY19maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2MgKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9jX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfY19maXRfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfY192YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfY19maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfY192YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfY192YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKIyBDUkYgc29jaWFsIGRpc3RhbmNpbmcgfiBleHRyYXZlcnNpb24KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX2VfZml0X3NvY2Rpc3QgPC0gY2ZvcmVzdChzbG9wZV9zb2NkaXN0IH4gcGVyc19lICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3NvY2Rpc3RbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfZV92YXJpbXBfc29jZGlzdCA8LSB2YXJpbXAoY3JmX2VfZml0X3NvY2Rpc3QsIG5wZXJtID0gMSkKY3JmX2VfdmFyaW1wX2NvbmRfc29jZGlzdCA8LSB2YXJpbXAoY3JmX2VfZml0X3NvY2Rpc3QsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX2VfdmFyaW1wX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX2VfdmFyaW1wX2NvbmRfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCiMgQ1JGIHNvY2lhbCBkaXN0YW5jaW5nIH4gYWdyZWVhYmxlbmVzcwpgYGB7cn0KCmN0cmxzIDwtIGNmb3Jlc3RfdW5iaWFzZWQobnRyZWU9NTAwLCBtdHJ5PTUpCgpjcmZfYV9maXRfc29jZGlzdCA8LSBjZm9yZXN0KHNsb3BlX3NvY2Rpc3QgfiBwZXJzX2EgKyB3b21lbiArIGFjYWRlbWljcyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zcGl0YWxfYmVkcyArIGdkcCArIG1hbnVmYWN0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0ICsgYWdlICsgcG9wZGVucywgCiAgICAgICAgICAgICAgICAgICAgICAgICBkZl9nZXJfc2xvcGVfc29jZGlzdFstMV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9hX3ZhcmltcF9zb2NkaXN0IDwtIHZhcmltcChjcmZfYV9maXRfc29jZGlzdCwgbnBlcm0gPSAxKQpjcmZfYV92YXJpbXBfY29uZF9zb2NkaXN0IDwtIHZhcmltcChjcmZfYV9maXRfc29jZGlzdCwgY29uZGl0aW9uYWwgPSBULCBucGVybSA9IDEpCgpjcmZfYV92YXJpbXBfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpjcmZfYV92YXJpbXBfY29uZF9zb2NkaXN0ICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmBgYAoKCiMgQ1JGIHNvY2lhbCBkaXN0YW5jaW5nIH4gbmV1cm90aWNpc20KYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX25fZml0X3NvY2Rpc3QgPC0gY2ZvcmVzdChzbG9wZV9zb2NkaXN0IH4gcGVyc19uICsgd29tZW4gKyBhY2FkZW1pY3MgKwogICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3BpdGFsX2JlZHMgKyBnZHAgKyBtYW51ZmFjdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydCArIGFnZSArIHBvcGRlbnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgZGZfZ2VyX3Nsb3BlX3NvY2Rpc3RbLTFdLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xzID0gY3RybHMpCgpjcmZfbl92YXJpbXBfc29jZGlzdCA8LSB2YXJpbXAoY3JmX25fZml0X3NvY2Rpc3QsIG5wZXJtID0gMSkKY3JmX25fdmFyaW1wX2NvbmRfc29jZGlzdCA8LSB2YXJpbXAoY3JmX25fZml0X3NvY2Rpc3QsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX25fdmFyaW1wX3NvY2Rpc3QgJT4lIGFzLmRhdGEuZnJhbWUoKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCd2YXJpYWJsZScpICU+JQogIGdncGxvdChhZXMoeD12YXJpYWJsZSwgeT0uKSkgKwogIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKY3JmX25fdmFyaW1wX2NvbmRfc29jZGlzdCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCkpCgpgYGAKCg==